//Thread.hpp
//自己写的Thread对象
#pragma once
#include <iostream>
#include <string>
#include <pthread.h>
#include <vector>
#include <unistd.h>
#include <functional>
using namespace std;
using func_t=function<void*(void*)>;
enum Status
{
    NEW,
    RUNNING,
    EXIT,
};


class Thread
{
    public:
    Thread(int num,func_t func,void* arg)
    :_func(func),
    _arg(arg)
    {
        char buff[1024];
        snprintf(buff,sizeof(buff),"thread-%d",num);
        _name+=buff;
        _status=NEW;
    }


    void Run()
    {
        if(0!=pthread_create(&_tid,nullptr,RunHelper,this))
        //这边又封装了一层，来让我们线程控制的函数能够让我们进行控制，为后续的线程池做铺垫
        {
            exit(-1);
        }
        _status=RUNNING;
    }

    static void* RunHelper(void* arg)
    {
       Thread* td=static_cast<Thread*>(arg);
        (*td)();//这边也封装了一层
        
    }

    void* operator()()
    {
        return _func(_arg);
    }


    void Join(void)
    {
        int n=pthread_join(_tid,nullptr);
          if(n!=0)
        {
            exit(-2);
        }
        _status=EXIT;
    }

    string ThreadName()
    {
        return _name;
    }

    pthread_t ThreadId()
    {
        if(_status==RUNNING)
        {
        return _tid;
        }
        else
        {
            return 0;
        }
    }


    private:
    string _name;//线程名
    pthread_t _tid;//线程id
    Status _status;//线程当前的一个状态 
    func_t  _func;//线程执行的函数
    void* _arg;//传给线程执行的函数参数
};


//退出码：
//-1-> pthread_create error
//-2-> pthread_join error